import { useUserStore } from '@/stores/user'

/**
 * 鉴权工具函数
 */

/**
 * 检查用户是否已登录，未登录则跳转到登录页
 * @param {Object} options 配置选项
 * @param {string} options.title 弹窗标题
 * @param {string} options.content 弹窗内容
 * @param {string} options.redirectUrl 登录成功后的重定向地址
 * @param {Function} options.onCancel 取消回调
 * @returns {boolean} 是否已登录
 */
export const requireAuth = (options = {}) => {
  const userStore = useUserStore()
  
  if (userStore.isLoggedIn) {
    return true
  }
  
  const {
    title = '请先登录',
    content = '此功能需要先登录账户',
    redirectUrl = '',
    onCancel = null
  } = options
  
  uni.showModal({
    title,
    content,
    confirmText: '去登录',
    cancelText: '取消',
    success: (res) => {
      if (res.confirm) {
        const loginUrl = redirectUrl 
          ? `/pages/login/login?redirect=${encodeURIComponent(redirectUrl)}`
          : '/pages/login/login'
        
        uni.navigateTo({
          url: loginUrl
        })
      } else if (onCancel) {
        onCancel()
      }
    }
  })
  
  return false
}

/**
 * 检查用户是否已登录，未登录则显示提示但不跳转
 * @param {string} message 提示消息
 * @returns {boolean} 是否已登录
 */
export const checkAuth = (message = '请先登录') => {
  const userStore = useUserStore()
  
  if (userStore.isLoggedIn) {
    return true
  }
  
  uni.showToast({
    title: message,
    icon: 'none',
    duration: 2000
  })
  
  return false
}

/**
 * 路由守卫 - 需要登录的页面使用
 * @param {Function} callback 登录后的回调函数
 * @param {Object} options 配置选项
 */
export const authGuard = (callback, options = {}) => {
  if (requireAuth(options)) {
    callback()
  }
}

/**
 * 会员等级检查
 * @param {number} requiredLevel 需要的会员等级
 * @param {string} message 提示消息
 * @returns {boolean} 是否满足等级要求
 */
export const checkMemberLevel = (requiredLevel, message = '会员等级不足') => {
  const userStore = useUserStore()
  
  if (!userStore.isLoggedIn) {
    requireAuth({
      title: '请先登录',
      content: '查看会员权益需要先登录账户'
    })
    return false
  }
  
  if (userStore.memberLevel >= requiredLevel) {
    return true
  }
  
  uni.showModal({
    title: '会员等级不足',
    content: message,
    confirmText: '了解会员',
    cancelText: '取消',
    success: (res) => {
      if (res.confirm) {
        uni.switchTab({
          url: '/pages/member/member'
        })
      }
    }
  })
  
  return false
}

/**
 * 余额检查
 * @param {number} requiredAmount 需要的金额
 * @param {string} message 提示消息
 * @returns {boolean} 是否余额充足
 */
export const checkBalance = (requiredAmount, message = '余额不足') => {
  const userStore = useUserStore()
  
  if (!userStore.isLoggedIn) {
    requireAuth({
      title: '请先登录',
      content: '查看余额需要先登录账户'
    })
    return false
  }
  
  if (userStore.balance >= requiredAmount) {
    return true
  }
  
  uni.showModal({
    title: '余额不足',
    content: `${message}，当前余额：¥${userStore.balance.toFixed(2)}`,
    confirmText: '去充值',
    cancelText: '取消',
    success: (res) => {
      if (res.confirm) {
        uni.navigateTo({
          url: '/pages/member/recharge'
        })
      }
    }
  })
  
  return false
}

/**
 * 页面访问权限检查（用于页面onMounted）
 * @param {Object} options 配置选项
 * @param {boolean} options.requireLogin 是否需要登录
 * @param {number} options.requiredLevel 需要的会员等级
 * @param {string} options.fallbackUrl 权限不足时的跳转地址
 */
export const checkPageAccess = (options = {}) => {
  const {
    requireLogin = true,
    requiredLevel = 0,
    fallbackUrl = '/pages/index/index'
  } = options
  
  const userStore = useUserStore()
  
  // 检查登录状态
  if (requireLogin && !userStore.isLoggedIn) {
    uni.showModal({
      title: '请先登录',
      content: '访问此页面需要先登录账户',
      confirmText: '去登录',
      cancelText: '返回首页',
      success: (res) => {
        if (res.confirm) {
          uni.navigateTo({
            url: '/pages/login/login'
          })
        } else {
          uni.switchTab({
            url: fallbackUrl
          })
        }
      }
    })
    return false
  }
  
  // 检查会员等级
  if (requiredLevel > 0 && userStore.memberLevel < requiredLevel) {
    uni.showModal({
      title: '权限不足',
      content: '访问此页面需要更高的会员等级',
      confirmText: '了解会员',
      cancelText: '返回',
      success: (res) => {
        if (res.confirm) {
          uni.switchTab({
            url: '/pages/member/member'
          })
        } else {
          uni.navigateBack()
        }
      }
    })
    return false
  }
  
  return true
}

/**
 * 功能权限检查装饰器
 * @param {Function} func 要执行的函数
 * @param {Object} authOptions 鉴权选项
 * @returns {Function} 包装后的函数
 */
export const withAuth = (func, authOptions = {}) => {
  return (...args) => {
    if (requireAuth(authOptions)) {
      return func(...args)
    }
  }
}
